function getRandomObjectsByTypesFromArray(arr, N = 10, types = []) {
  var result = [];
  var indexes = {}; // 用于记录已经取出的对象的下标

  // 循环 N 次，每次随机取出一个未被取出过的指定类型的对象（如果有指定类型），或者任意类型的对象（如果没有指定类型）
  for (var i = 0; i < N; i++) {
    var index = Math.floor(Math.random() * arr.length); // 随机生成一个下标
    while (
      index in indexes ||
      (types.length > 0 && !types.includes(arr[index].type))
    ) {
      // 如果下标已经被取出过或者该对象的类型不在指定的 types 数组中（如果有指定类型），则重新生成
      index = Math.floor(Math.random() * arr.length);
    }
    indexes[index] = true; // 记录该下标已经被取出
    result.push(arr[index]); // 将该下标对应的对象添加到结果数组中
  }

  return result;
}
